import os
import random
import re

from dashscope import Generation
from django.db.models import Q

from rest_framework.response import Response
from rest_framework.views import APIView

from user.models import UserModel
from utils.jwttool import tooljwt
from utils.myredis import redistoll
from .tests import send
from .userser import UserSerializer


# Create your views here.


# 密码登录
class Loginpwd(APIView):
    def post(self,request):
        # 获取前端传来的account用户名，并赋值给新的变量account
        account = request.data.get('account')
        # 获取前端传来的password密码，并赋值给新的变量password
        password = request.data.get('password')
        # 用条件查询的方法采用Q查询来筛选符合条件的第一条数据，通过Usermodel里的数据进行查询拿到该数据并赋值给info
        info = UserModel.objects.filter(Q(username=account) | Q(phone=account) | Q(email=account)).first()
        # 然后对info进行判断，如果info为空的话，就代表没有对应的数据
        if info is None:
            # 这时候就返回状态码400和消息账号不存在
            return Response({'code': 400, 'msg': '账号不存在'})
        # 如果账号存在，那就用info.password来和前端传来的password进行对比
        elif info.password == password:
            # 如果账号对应的密码没问题那就将id，账号，以及token存入data这个字典中
            data = {
                'id': info.id,
                'account': account,
                'token': tooljwt.getToken(info.id,account)
            }
            # 在判断是否有头像
            if info.headimg:
                # 如果有头像就赋值给data字典中的headimg
                data['headimg'] = info.headimg
            else:
                # 如果没有就赋值一个默认的图片地址
                data['headimg'] = 'uploads/6.jpg'
                # 返回状态码200和消息登录成功，并且将data字典中的数据返回
                return Response({'code': 200, 'msg': '登录成功', 'data': data})
        # 否则就是密码错误登陆失败，返回code和消息
        return Response({'code': 400, 'msg': '密码错误'})

# 验证码发送
class SendCode(APIView):
    def post(self,request):
        # 获取从前端传来的电话号phone并赋值给phone
        phone = request.data.get('phone')
        # 生成一个随机对的四位数验证码并转换成字符串形式赋值个code
        code = str(random.randint(1000, 9999))
        # 从redis中获取于phone对应的验证码
        rediscode = redistoll.getstr(phone)
        # 如果rediscode存在那就不需要重复发送了
        if rediscode:
            # 返回状态码400和消息验证码已发送
            return Response({'code': 400, 'msg': '请勿重复发送'})
        # 如果redis中不存在该验证码那么就异步调用send函数,并传递验证码和手机号
        else:
            send.delay(phone,code)
            # 将生成的验证码code储存在redis中，设置过期时间为两分钟，键为phone
            redistoll.setstr(phone,code,120)
            return Response({'code': 200, 'msg': '验证码发送成功'})

# 验证码登录
class LoginCode(APIView):
    def post(self,request):
        # 从前端获取账号并赋值给account
        account = request.data.get('account')
        # 从前端获取验证码code
        code = request.data.get('code')
        # 从redis中获取对应账号的验证码
        rediscode = redistoll.getstr(account)
        # 判断用户输入的验证码和redis中的验证码是否不相等
        if code != rediscode:
            return Response({'code': 400, 'msg': '验证码错误'})
        # 根据获取的phone找到对应的account和isshow状态为1的用户记录,并将获取的值赋值给info
        info = UserModel.objects.filter(phone=account,isshow=1).first()
        # 判断info这个用户记录是否为空
        if info is None:
            # 如果是空的话就创建一个新的用户
            newdata = UserModel.objects.create(phone=account)
            # 为新用户生成token
            token = tooljwt.getToken(newdata.id,newdata.phone)
            # 获取新创建用户的id
            id = newdata.id
            data = {
                'id': id,
                'account': account,
                'token': token
            }
            return Response({'code': 200, 'msg': '登录成功', 'data': data})
        # 验证吗正确传token然后在传id，最后返回响应
        token = tooljwt.getToken(info.id,info.phone)
        id = info.id
        return Response({'code': 200, 'msg': '登录成功', 'data': {'id': id, 'account': account, 'token': token}})

# 检查手机号是否注册过
class CheckPhone(APIView):
    def post(self,request):
        # 获取前端传来的手机号并赋值个phone
        phone = request.data.get('phone')
        # 通过手机号查找用户记录判断手机号是否注册过
        info = UserModel.objects.filter(phone=phone).first()
        if info:
            # 如果注册过就返回状态码400和消息手机号已注册
            return Response({'code': 400, 'msg': '手机号已注册'})
        else:
            # 如果没有注册过就返回状态码200和消息手机号可用
            return Response({'code': 200, 'msg': '手机号可用'})

# 注册功能
class Register(APIView):
    def post(self,request):
        # 创建一个空的字段用来储存注册的数据
        data = {}
        # 接收前端传来的账号密码和验证码
        account = request.data.get('account')
        password = request.data.get('password')
        code = request.data.get('code')
        # 从redis中获取对应账号的验证码
        rediscode = redistoll.getstr(account)
        # 编写一个用于验证邮箱的正则表达式
        email_re = re.compile(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$')
        #判断是否是邮箱
        if re.match(email_re,account):
            #如果符合规则那就将其储存到data中
            data['email'] = account
        # 编写一个用于验证手机号的正则表达式
        elif re.match(r'^1[3-9]\d{9}$',account):
            # 如果符合规则就检查一下数据库中是否有相应的记录，如果有那就返回手机号已存在
            if UserModel.objects.filter(phone=account).first():
                return Response({'code': 400, 'msg': '手机号已存在'})
            # 判断一下验证码如果为空那就返回验证码为空，验证码不对那就返回验证码错误
            if code == '':
                return Response({'code': 400, 'msg': '验证码不能为空'})
            elif code != rediscode:
                return Response({'code': 400, 'msg': '验证码错误'})
            # 如果没有就储存到data中
            else:
                data['phone'] = account
        # 用户名的话直接储存
        else:
            data['username'] = account
        # 判断密码是否为空
        if password == '':
            return Response({'code': 400, 'msg': '密码不能为空'})
        else:
            # 如果密码不为空就储存到data中
            data['password'] = password
        #然后将data中的数据进行序列化然后验证并返回相应的信息
        ser = UserSerializer(data=data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 200, 'msg': '注册成功'})
        else:
            return Response({'code': 400, 'msg': ser.errors})

class PropmtView(APIView):
    def get(self,request):
        msgs = request.query_params.get('msgs')
        response = Generation.call(
            api_key = os.getenv("DASHSCOPE_API_KEY"),
            model = "qwen-turbo",
            prompt=msgs
        )
        if response.status_code == 200:
            return Response({'code': 200, "message":"成功",'data': response.output.text})
        else:
            print(response.status_code)
            print(response.message)
            return Response({'code': response.status_code, 'message':'成功','msg': response.message})
#